home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / RESCOD.68K < prev    next >
Text File  |  2001-09-30  |  25KB  |  801 lines

  1. ;RESCOD.68K    FEB-25-89    (ALSO SEE NULLSTR)
  2. ;APEX MEMORY-RESIDENT MODULE
  3. ;WRITTEN BY LOREN BLANEY FOR DFM ENGINEERING
  4. ;THIS IS BASED ON 6502 CODE WRITTEN BY P.J.R. BOYLE.
  5. ;
  6. ;REVISION HISTORY:
  7. ;FEB-28-86, ORIGINAL
  8. ;SEP-DEC-86, CHANGED TO ASM68K CONVENTIONS AND MODIFIED FOR NEW MEMORY
  9. ; MAP.
  10. ;APR-28-88, MODIFIED FOR MAC II.
  11. ;JUN-88, FIXED ERROR ROUTINE WHICH DIDN'T LOOK FOR THE CORRECT STRING
  12. ; TERMINATION, MADE SWAP SIZE VERY SMALL (TO FIX WRITE-PROTECTED RAM
  13. ; DISK), FIXED UNINSTALLED DEBUGGER BUG, REMOVED FASAVE, OPEN DISK ONLY
  14. ; AT BOOT UP.
  15. ;FEB-25-89, ADDED CONDITIONAL ASSEMBLY FLAG TO HANDLE AMIGA-1000'S NEED
  16. ; FOR A SMALL SWAP SIZE REQUIRED WITH WRITE-PROTECTED KICKSTART RAM.
  17. ;
  18. ;WARNINGS:
  19. ; IF THIS MODULE IS INSTALLED THEN ALL HANDLERS MUST BE REINSTALLED.
  20. ;
  21. ;NOTES:
  22. ; SCRATCH.SYS is nomally big enough to contain all the memory that Apex
  23. ; uses. This is essential for a swapping operating system. However,
  24. ; because of a special problem with the Amiga's RAM disk (it is write
  25. ; protected), SCRATCH.SYS has been made very small. With the 68000's
  26. ; relatively large amounts of memory, the swapping feature is unimpor-
  27. ; tant. Only two blocks are swapped. The first contains SYSPAG; the
  28. ; second is only used to avoid a possible bug where writting zero blocks
  29. ; writes many blocks.
  30.  
  31.     NOLIST
  32.     INCLUDE    SYSPAG        ;GET SYSTEM PAGE DEFINITIONS
  33.     LIST
  34.  
  35. ;SYSTEM DEFINITIONS:
  36.     IF    A1000
  37. SWPLOC    EQU    MEMTOP -$4100    ;BASE ADDRESS OF SWAPPED MEMORY (1 BLOCK
  38.     ELSE            ; FOR SAFETY)
  39. SWPLOC    EQU    MEMTOP -$B800    ;BASE ADDRESS OF SWAPPED MEMORY
  40.     ENDIF
  41. SWPEND    EQU    MEMTOP -$4000    ;END OF SWAPPED MEMORY +1
  42. SWPSIZ    EQU    [SWPEND-SWPLOC]/$100 ;SIZE OF SWAPPED MEMORY (BLOCKS)
  43. DIRBUF    EQU    MEMTOP -$B800    ;LOC FSCAN USES FOR THE DIRECTORY (1K)
  44.  
  45. XDIRBLK    EQU    1        ;BLOCK WHERE EXTENDED DIRECTORY BEGINS
  46. DIRBLK    EQU    9        ;BLOCK WHERE THE MAIN DIRECTORY BEGINS
  47.  
  48. MAXFL    EQU    47        ;MAX NO. OF FILES (-1) ON ONE DIRECTORY
  49. EXTPAT    EQU    $A5        ;PATTERN INDICATING VALID EXTENDED DIR
  50.  
  51. COMPAG    ORG    MEMTOP -$3000    ;APEX'S COPY OF SYSPAG
  52.     ORG    @ +$100
  53. START    EQU    @        ;MARK START OF THIS MODULE
  54.  
  55. ;=======================================================================
  56. ;ENTRY POINTS:
  57. ;
  58. ; *** KLUDGE TO INITIALIZE RAM DISK UNIT 2. ***
  59. ; APEX SHOULD BE FIXED SO THAT "SY N" REALLY ENTERS HERE. AND THAT UNIT
  60. ; "N" IS OPENED. FOR NOW IT IS KLUDGED.
  61. ;
  62. OPENUNT2
  63.     LEA    MEMTOP.L,SP    ;SET STACK
  64.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  65.  
  66.     CLR.B    UNIT        ;INITIALIZE THE DISK DRIVER
  67.     MOVEA.W    #0,A6        ;OPEN(0)
  68.     BSR    UNTHAN
  69.  
  70.     MOVE.B    #2,UNIT        ;INITIALIZE THE DISK DRIVER
  71.     BSR    UNTHAN        ;OPEN(0)
  72.  
  73. ;RELOAD APEX FROM THE SYSTEM UNIT AND START IT.
  74. ; THIS IS THE FIRST-TIME, BOOT-UP ENTRY POINT.
  75. ;
  76. RELOAD    LEA    MEMTOP.L,SP    ;SET STACK
  77.     MOVE.B    #$FC,SYSENF    ;INDICATE A "RELOAD" ENTRY
  78.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  79.     CLR.B    CMDMOD        ;TURN OFF EXEC MODE (COMMAND FILES)
  80.  
  81.     CLR.B    DEVICE        ;INITIALIZE THE CONSOLE
  82.     MOVEA.W    #0,A6        ;OPENI(0)
  83.     BSR    DEVHAN
  84.     MOVEA.W    #4,A6        ;OPENO(0)
  85.     BSR    DEVHAN
  86.  
  87. ;    MOVE.B    SYSUNT,UNIT    ;INITIALIZE THE DISK DRIVER
  88. ;    MOVEA.W    #0,A6        ;OPEN(0)
  89. ;    BSR    UNTHAN
  90. ;    BSR    SHOWERR        ;SHOW ERROR IF ANY
  91.  
  92.     MOVE.B    SYSUNT,UNIT    ;SCAN FOR "SYSTEM.SYS" ON SYSTEM UNIT
  93.     LEA    SYSFIL-@-2(PC),A6
  94.     BSR    FSCAN
  95.     BSR    SHOWERR        ;GO HANDLE FILE NOT FOUND ERROR, IF ANY
  96.     MOVE.L    BLKNO,SYSBLK    ;SAVE SYSTEM.SYS BLOCK NUMBER FOR LATER
  97.     BRA    FRUN        ;START THE SYSTEM
  98.  
  99. SYSFIL    ASCII    'SYSTEM  SYS '    ;SYSTEM FILE NAME
  100.     DC.B    0
  101. SWPFIL    ASCII    'SCRATCH SYS '    ;SWAP (SCRATCH) FILE NAME
  102.     DC.B    0
  103.  
  104. ;-----------------------------------------------------------------------
  105. ;RE-ENTER APEX BUT RELOAD IT ONLY IF THE "SYBOMB" FLAG IS SET.
  106. ; THIS IS THE NORMAL ENTRY POINT TAKEN AFTER A PROGRAM FINISHES OR WHEN
  107. ; A CTRL-C IS PRESSED.
  108. ; NOTE THAT ALL .SAV FILES BOMB SYSPAG. SO APEX'S SYSPAG IS SAVED IN
  109. ; COMPAG TO AVOID HAVING TO REREAD IT FROM DISK, WHICH SPEEDS THINGS UP
  110. ; A LITTLE.
  111. ;
  112. ; THE STATE OF THE "SYBOMB" FLAG IS USED TO DETERMINE THE FOLLOWING:
  113. ;    00    SYSTEM IS NOT BOMBED, JUST SYSPAG
  114. ;    55    SYSTEM IS NOT BOMBED, AND SYSPAG IS OK
  115. ;    OTHER    RELOAD APEX
  116. ;
  117. RENTER    LEA    MEMTOP.L,SP    ;SET STACK
  118.     MOVE.B    #$FD,SYSENF    ;INDICATE A "REENTER" ENTRY
  119.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  120.  
  121. RENTERX    TST.B    SYBOMB        ;ATTEMPT TO GET APEX'S SYSTEM PAGE
  122.     BNE.S    REN20        ; FROM COMPAG
  123.     MOVEQ    #63,D0        ;GET 64 LONG WORDS = 256 BYTES
  124.     LEA    COMPAG-@-2(PC),A5 ;SET UP POINTERS
  125.     LEA    SYSPAG,A6
  126. REN10    MOVE.L    (A5)+,(A6)+    ;MOVE COMPAG INTO SYSPAG
  127.     DBF    D0,REN10
  128. REN20
  129.     CMPI.B    #$55,SYBOMB    ;VALID SYSPAG?
  130.     BEQ    FRUNX        ;BRANCH IF SO -- APEX IS IN MEMORY
  131.                 ;(FSAVE ENTRY MUST BE INDICATED EVEN IF
  132.                 ; APEX IS RELOADED)
  133.  
  134.     MOVE.B    SYSUNT,UNIT    ;SCAN FOR "SYSTEM.SYS" ON SYSTEM UNIT
  135.     LEA    SYSFIL-@-2(PC),A6
  136.     BSR    FSCAN
  137.     BSR    SHOWERR        ;GO HANDLE FILE NOT FOUND ERROR, IF ANY
  138.     MOVE.L    BLKNO,SYSBLK    ;SAVE SYSTEM.SYS BLOCK NUMBER FOR LATER
  139.     BRA    FRUN        ;START THE SYSTEM
  140.  
  141. ;-----------------------------------------------------------------------
  142. ;SAVE THE PART OF THE MEMORY IMAGE THAT WILL BE BOMBED BY APEX, THEN
  143. ; RELOAD AND RESTART APEX.
  144. ; THIS IS THE NORMAL ENTRY POINT FOR A CTRL-P.
  145. ;
  146. SAVER    LEA    MEMTOP.L,SP    ;SET STACK
  147.     MOVE.B    #$FE,SYSENF    ;INDICATE A "SAVER" ENTRY
  148.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  149.  
  150.     MOVE.B    SYSUNT,UNIT    ;LOOK FOR "SCRATCH.SYS" ON SYSTEM UNIT
  151.     LEA    SWPFIL-@-2(PC),A6
  152.     BSR    FSCAN
  153.     BSR    SHOWERR        ;HANDLE "FILE NOT FOUND" ERROR, IF ANY
  154.     MOVE.L    BLKNO,SWPBLK    ;SAVE "SCRATCH.SYS" BLOCK NO. FOR LATER
  155.  
  156.     MOVE.L    #SWPLOC,DSKMEM    ;WRITE THE PART OF THE MEMORY IMAGE THAT
  157.     MOVE.L    #SWPSIZ,DSKSIZ    ; WILL BE BOMBED BY "SYSTEM.SYS" INTO
  158.     BSR    SAVE        ; "SCRATCH.SYS"
  159.  
  160.     BRA    RENTERX        ;GO RESTART APEX
  161.  
  162. ;=======================================================================
  163. ;SPECIAL INTRINSICS FOR APEX:
  164. ; (NOTE THAT THESE "INTRINSICS" ARE NOT CALLED DIRECTLY BY XPL CODE, BUT
  165. ; THROUGH THE REAL INTRINSICS IN INT32.68K)
  166. ;
  167. ;RUN THE MEMORY IMAGE (.SAV FILE) WHICH BEGINS AT "BLKNO" ON "UNIT".
  168. ; THE LOAD LOCATION (DSKMEM) AND THE NUMBER OF BLOCKS TO LOAD (DSKSIZ)
  169. ; ARE GOTTEN FROM "SYSPAG" WHICH IS SAVED AS THE FIRST BLOCK OF THE FILE
  170. ;
  171. ; FRUN(UNIT, BLKNO)
  172. ;
  173. ; (THE READ INTRINSIC IS NOT SUFFICIENT BECAUSE THE LOADED PROGRAM MAY
  174. ; BOMB THE SYSTEM AND PREVENT IT FROM STARTING THE LOADED PROGRAM.)
  175. ;
  176. FRUN    LEA    MEMTOP.L,SP    ;SET STACK (FOR SWAP AREA)
  177.     BSR    SAVPAG        ;SAVE APEX'S SYSTEM-PAGE PARAMETERS
  178.     BSR    GET        ;LOAD THE MEMORY IMAGE (THE PROGRAM)
  179. FRUNX    CLR.B    RERUNF        ;CLEAR THE RERUN FLAG
  180.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  181.     MOVEA.L    STACK,A7    ;SET THE STACK POINTER
  182.     MOVEA.L    HEAP,A5        ;SET THE HEAP POINTER
  183.     JSR    VSTART        ;CALL THE LOADED PROGRAM
  184.     BSR    SHOWERR        ;DISPLAY ANY ERRORS
  185.     JMP    VEXIT        ;TAKE THE PROGRAM'S EXIT VECTOR
  186.  
  187. ;-----------------------------------------------------------------------
  188. ;GET THE MEMORY IMAGE (.SAV FILE) WHICH BEGINS AT "BLKNO" ON "UNIT"
  189. ; AND START THE DEBUGGER. SAME AS FRUN, BUT IT STARTS THE DEBUGGER
  190. ; INSTEAD OF THE LOADED PROGRAM.
  191. ; FGET(UNIT,BLKNO)
  192. ;
  193. FGET    LEA    MEMTOP.L,SP    ;SET STACK (FOR SWAP AREA)
  194.     BSR    SAVPAG        ;SAVE APEX'S SYSTEM-PAGE PARAMETERS
  195.     BSR    GET        ;LOAD THE MEMORY IMAGE
  196.     CLR.B    RERUNF        ;CLEAR THE RERUN FLAG
  197.     CLR.L    ERRLOC        ;INDICATE NO ERRORS
  198.     MOVEA.L    STACK,A7    ;SET THE STACK POINTER
  199.     MOVEA.L    HEAP,A5        ;SET THE HEAP POINTER
  200.     JMP    VBUG        ;CALL THE DEBUGGER
  201.  
  202. ;-----------------------------------------------------------------------
  203. ;SAVE A MEMORY IMAGE FOR A .SAV FILE (CMDSAV)
  204. ; FSAVE(UNIT,BLKNO)
  205. ; IN ADDITION TO THE "UNIT" AND "BLKNO" INPUTS, THE MEMORY ADDRESS
  206. ; (USRMEM) AND THE SIZE IN PAGES (PROSIZ) ARE GIVEN. THESE ARE SET UP
  207. ; BY THE USER'S PROGRAM OR THE APEX SAVE COMMAND (FROG=$400,$9000) AND
  208. ; ARE IN THE SAVED PORTION OF THE SYSTEM PAGE.
  209. ;
  210. ; THIS INTRINSIC IS REQUIRED BECAUSE THE USER'S PROGRAM MAY USE (BOMB)
  211. ; APEX'S MEMORY SPACE. THE RESIDENT CODE MUST BE ABLE TO LOAD THE USER'S
  212. ; PROGRAM BACK INTO MEMORY [FROM SCRATCH.SYS], THEN WRITE THE ENTIRE
  213. ; IMAGE INTO A .SAV FILE.
  214. ;
  215. FSAVE    LEA    MEMTOP.L,SP    ;SET STACK (FOR SWAP AREA)
  216.     MOVE.B    UNIT,-(SP)    ;SAVE THE .SAV FILE'S UNIT AND
  217.     MOVE.L    BLKNO,-(SP)    ; STARTING BLOCK NUMBER
  218.  
  219.     MOVE.B    SYSUNT,UNIT    ;LOAD "SCRATCH.SYS" (IN CASE THE .SAV
  220.     MOVE.L    SWPBLK,BLKNO    ; FILE BOMBED APEX)
  221.     BSR    SAVPAG        ;SAVE APEX'S SYSTEM-PAGE PARAMETERS
  222.     BSR    GET
  223.  
  224.     MOVE.L    (SP)+,BLKNO    ;GET THE .SAV FILE'S PARAMETERS
  225.     MOVE.B    (SP)+,UNIT
  226.     MOVE.L    PROSIZ,DSKSIZ    ;SET UP THE SYSTEM PAGE PARAMETERS SO WE
  227.     MOVE.L    USRMEM,DSKMEM    ; KNOW HOW BIG IT IS AND WHERE IT STARTS
  228.     BSR    SAVE        ;SAVE THE MEMORY IMAGE ON THE GIVEN UNIT
  229.                 ; AND BLOCK NUMBER
  230.     MOVE.B    #$FF,SYSENF    ;INDICATE A "FSAVE" RE-ENTRY CONDITION
  231.     BRA    RENTERX        ;GO RE-ENTER APEX
  232.  
  233. ;-----------------------------------------------------------------------
  234. ;THIS INTRINSIC WRITES THE CURRENT MEMORY IMAGE TO DISK. RIGHT NOW, IT
  235. ; IS ONLY USED TO WRITE THE SYSTEM MEMORY IMAGE INTO "SYSTEM.SYS" (WS).
  236. ; THIS IS A CONVENIENCE FOR SYSTEM HACKERS WHICH IS NOT NORMALLY USED.
  237. ; FASAVE(UNIT,BLKNO)
  238. ;
  239. ; IN ADDITION TO THE "UNIT" AND "BLKNO" INPUTS, THE MEMORY ADDRESS
  240. ; (USRMEM) AND THE SIZE IN PAGES (PROSIZ) ARE GIVEN. THESE ARE SET UP
  241. ; BY APEX.XPL AND ARE IN THE SAVED PORTION OF THE SYSTEM PAGE.
  242. ;
  243. ;FASAVE    MOVE.L    USRMEM,DSKMEM    ;GET THE BASE ADDRESS
  244. ;    MOVE.L    PROSIZ,DSKSIZ    ;GET THE NUMBER OF BLOCKS
  245. ;    BSR    SAVE        ;SAVE (WRITE) THE MEMORY IMAGE
  246. ;
  247. ;    MOVE.B    #$F0,SYSENF    ;INDICATE A "FASAVE" RE-ENTRY CONDITION
  248. ;    BRA    RENTERX        ;GO REENTER APEX
  249. ;
  250. ;-----------------------------------------------------------------------
  251. ;SCAN THE DIRECTORY FOR A FILE NAME
  252. ; SCAN(UNIT, BLOCKS, FILENAME)
  253. ;
  254. ; INPUTS: UNIT - UNIT TO SCAN
  255. ;    A6 - CONTAINS THE ADDRESS OF THE FILE NAME
  256. ; OUTPUTS: BLKNO - THE STARTING BLOCK NUMBER OF THE FILE (IF FOUND)
  257. ;    ENDBLK - THE LAST BLOCK OF THE FILE (IF FOUND)
  258. ;
  259. ;    ERRLOC - "XXXXXXXX.XXX" NOT FOUND ERROR MESSAGE
  260. ;
  261. ; REGISTER USAGE:
  262. ;    D0 - SCRATCH, BYTE COUNTER
  263. ;    D1 - FILE COUNTER
  264. ;    A0 - INDEX FOR DIRECTORY NAMES (11-BYTE)
  265. ;    A1 - INDEX FOR STATUS ARRAY IN THE DIRECTORY (BYTE)
  266. ;    A2 - INDEX FOR FILE BLOCKS IN THE DIRECTORY (WORD)
  267. ;    A3 - SCRATCH POINTER TO THE FILE NAME BEING LOOKED UP
  268. ;    A4 - SCRATCH POINTER TO THE FILE NAME IN THE DIRECTORY
  269. ;    A6 - POINTER TO THE FILE NAME BEING LOOKED UP
  270. ;
  271. ; NOTE: THE DIRECTORY CONSISTS OF TWO PARTS, EACH OF WHICH MAY HOLD UP
  272. ; TO 48 FILES. THE PRIMARY DIRECTORY IS SCANNED FIRST. IF THE FILE NAME
  273. ; IS NOT FOUND, THE EXTENDED DIRECTORY IS READ IN AND SCANNED.
  274. ;
  275. STATUS    EQU    528        ;OFFSET TO STATUS ARRAY IN DIRECTORY
  276. FIRBLK    EQU    576        ;OFFSET TO FIRST BLOCK ARRAY
  277. LASBLK    EQU    672        ;OFFSET TO LAST BLOCK ARRAY
  278.  
  279. FSCAN    MOVEM.L    D0/D1/A0-A4,-(SP)    ;SAVE REGISTERS
  280.  
  281.     MOVE.L    #DIRBLK,BLKNO    ;GET THE PRIMARY DIRECTORY
  282.  
  283. FS05    MOVEA.L    A6,A3        ;SAVE THE FILE NAME ADDRESS
  284.     MOVE.L    #DIRBUF,FADDR    ;READ A DIRECTORY
  285.     MOVE.L    #4,NBLKS
  286.     MOVEA.W    #8,A6        ;SET FUNCTION CODE FOR "READ"
  287.     BSR    UNTHAN
  288.     MOVEA.L    A3,A6        ;RESTORE A6 WITH THE FILE NAME
  289.     TST.L    ERRLOC        ;DID WE GET AN ERROR?
  290.     BNE    FS90        ;RETURN IF WE DID
  291.  
  292.     MOVEA.L    #DIRBUF,A0    ;POINT TO FILE NAMES IN THE DIRECTORY
  293.     MOVEA.L    A0,A1        ;INITIALIZE THE FILE INDEX FOR BYTES
  294.     MOVEA.L    A0,A2        ;INITIALIZE THE FILE INDEX FOR WORDS
  295.     MOVEQ    #MAXFL,D1    ;INITIALIZE THE FILE COUNTER (0-47)
  296.  
  297. FS10    TST.B    STATUS(A1)    ;CHECK THE STATUS BYTE FOR FILE
  298.     BLE.S    FS30        ;BRANCH IF FILE IS NOT VALID (ACTIVE)
  299.  
  300.     MOVEA.L    A6,A3        ;DOES THIS FILE NAME MATCH OURS (A6)?
  301.     MOVEA.L    A0,A4        ;INITIALIZE SCRATCH POINTERS
  302.     MOVEQ    #10,D0        ;COMPARE 11 BYTES (0-10)
  303. FS20    CMPM.B    (A3)+,(A4)+
  304.     DBNE    D0,FS20        ;EXIT LOOP IF NOT EQUAL OR WHEN D0 = -1
  305.     BEQ.S    FS70        ;BRANCH IF THE NAMES MATCH
  306.  
  307. FS30    ADDA.L    #11,A0        ;POINT TO NEXT FILE NAME IN DIRECTORY
  308.     ADDQ.L    #1,A1        ;BUMP INDEX TO NEXT STATUS BYTE
  309.     ADDQ.L    #2,A2        ;BUMP INDEX TO NEXT WORD
  310.     DBF    D1,FS10        ;LOOP FOR ALL FILES
  311.  
  312.     CMPI.B    #EXTPAT,DIRBUF+1023.L    ;IS THERE AN EXTENDED DIRECTORY?
  313.     BNE.S    FS60        ;BRANCH IF NOT
  314.     CMPI.L    #XDIRBLK,BLKNO    ;BRANCH IF WE HAVE ALREADY SEARCHED THE
  315.     BEQ.S    FS60        ; EXTENDED DIRECTORY
  316.     MOVE.L    #XDIRBLK,BLKNO    ;GO BACK AND SEARCH THE EXTENDED DIR
  317.     BRA.S    FS05
  318.  
  319. ;COME HERE IF THE FILE WAS NOT FOUND
  320. FS60    MOVEQ    #10,D0        ;INSERT FILE NAME INTO THE ERROR MESSAGE
  321.     MOVEA.L    A6,A3        ;MOVE 11 BYTES FROM (A6) INTTO FS66+6
  322.     MOVEA.L    #FS66+6,A4    ;WARNING: SELF-MODIFYING CODE (NOT
  323. FS63    MOVE.B    (A3)+,(A4)+    ; ROMMABLE AND NOT RE-ENTRANT)
  324.     CMPI.W    #3,D0        ;INSERT A DOT AFTER THE 8TH CHARACTER
  325.     BNE    FS65        ;(NOTE THAT THERE IS NO DOT IN THE FILE
  326.     MOVE.B    #'.',(A4)+    ; NAME IN THE DIRECTORY)
  327. FS65    DBF    D0,FS63
  328.  
  329.     BSR    ERROR        ;REPORT THE ERROR
  330. FS66    ASCII    '22 - "XXXXXXXX.XXX" NOT FOUND'
  331.     DC.B    0
  332.     BRA.S    FS90        ;EXIT
  333.  
  334. FS70    CLR.L    D0        ;???
  335.     MOVE.W    FIRBLK(A2),D0    ;WE FOUND THE FILE NAME        ????
  336.     ROL.W    #8,D0        ; SO RETURN ITS FIRST AND LAST BLOCKS???
  337.     MOVE.L    D0,BLKNO    ;SWAP THE BYTE ORDER TO CONFORM TO 68000
  338.     MOVE.W    LASBLK(A2),D0    ; STANDARDS   ????
  339.     ROL.W    #8,D0        ;????
  340.     MOVE.L    D0,ENDBLK
  341.  
  342. FS90    MOVEM.L    (SP)+,D0/D1/A0-A4    ;RESTORE REGISTERS
  343.     RTS
  344.  
  345. ;=======================================================================
  346. ;SUBROUTINES:
  347. ;
  348. ;GET THE MEMORY IMAGE (.SAV FILE) WHICH BEGINS AT "BLKNO" ON "UNIT"
  349. ;
  350. GET    MOVE.L    #SYSPAG,FADDR    ;READ IN THE SYSTEM PAGE
  351.     MOVE.L    #1,NBLKS    ; THIS LOADS IN "DSKMEM" AND "DSKSIZ"
  352.     BSR.S    READER        ; SO WE CAN...
  353.  
  354.     ADDQ.L    #1,BLKNO    ;POINT TO NEXT BLOCK ON UNIT
  355.     MOVE.L    DSKMEM,FADDR    ;READ IN THE MAIN BODY
  356.     MOVE.L    DSKSIZ,NBLKS
  357.     BSR.S    READER
  358.     RTS
  359.  
  360. ;-----------------------------------------------------------------------
  361. ;WRITE THE MEMORY IMAGE AT "DSKMEM" AND "DSKSIZ" ONTO "UNIT" BEGINNING
  362. ; AT "BLKNO".
  363. ;
  364. SAVE    MOVE.L    #SYSPAG,FADDR    ;WRITE THE SYSTEM PAGE
  365.     MOVE.L    #1,NBLKS
  366.     BSR.S    WRITER
  367.  
  368.     ADDQ.L    #1,BLKNO    ;POINT TO NEXT BLOCK ON UNIT
  369.     MOVE.L    DSKMEM,FADDR    ;WRITE THE MAIN BODY
  370.     MOVE.L    DSKSIZ,NBLKS
  371.     BSR.S    WRITER
  372.     RTS
  373.  
  374. ;-----------------------------------------------------------------------
  375. ;SAVE THE SYSTEM PAGE IN "COMPAG"
  376. ; THIS IS DONE TO SAVE APEX'S SYSTEM PAGE SO WE DON'T HAVE TO RELOAD IT
  377. ; FROM DISK IF THE SYSTEM IS NOT BOMBED BY THE USER PROGRAM. THIS JUST
  378. ; MAKES APEX RUN A LITTLE FASTER.
  379. ;
  380. SAVPAG    MOVEM.L    D0/A5/A6,-(SP)    ;SAVE REGISTERS
  381.  
  382.     MOVEQ    #63,D0        ;SAVE 64 LONG WORDS = 256 BYTES
  383.     LEA    COMPAG-@-2(PC),A5 ;SET UP POINTERS
  384.     LEA    SYSPAG,A6
  385.  
  386. SPP10    MOVE.L    (A6)+,(A5)+    ;MOVE SYSPAG INTO COMPAG
  387.     DBF    D0,SPP10
  388.  
  389.     MOVEM.L    (SP)+,D0/A5/A6    ;RESTORE REGISTERS
  390.     RTS
  391.  
  392. ;-----------------------------------------------------------------------
  393. ;READ A FILE FROM DISK AND HANDLE ERRORS IF ANY
  394. ; INPUTS: UNIT, BLKNO, FADDR, NBLKS.
  395. ;
  396. READER    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  397.  
  398.     MOVEA.W    #8,A6        ;SET FUNCTION CODE FOR "READ"
  399.     BSR    UNTHAN
  400.     BSR    SHOWERR        ;REPORT ANY ERROR
  401.  
  402.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  403.     RTS
  404.  
  405. ;-----------------------------------------------------------------------
  406. ;WRITE A FILE TO DISK AND HANDLE ERRORS IF ANY
  407. ;
  408. WRITER    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  409.  
  410.     MOVEA.W    #12,A6        ;SET FUNCTION CODE FOR "WRITE"
  411.     BSR    UNTHAN
  412.     BSR    SHOWERR        ;REPORT ANY ERROR
  413.  
  414.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  415.     RTS
  416.  
  417. ;=======================================================================
  418. ;UNIT AND DEVICE DISPATCHERS
  419. ;
  420. ;MAIN UNIT HANDLER
  421. ; DISPATCH TO A ROUTINE TO HANDLE THE FUNCTION CODE FOR A UNIT.
  422. ;    INPUTS:
  423. ;    UNIT = THE UNIT NUMBER (0-7)
  424. ;    A6 = FUNCTION CODE:
  425. ;        0 = OPEN
  426. ;        4 = OPEN
  427. ;        8 = READ
  428. ;        12 = WRITE
  429. ;        16 = CLOSE
  430. ;        20 = GET INFO
  431. ;        24... OTHER SPECIAL CODES ARE ALLOWED (BEWARE OF
  432. ;             SUBSTITUTING UNITS WITHOUT THESE FUNCTIONS)
  433. ;    BLKNO =    BLOCK ON THE DISK TO START READ/WRITE
  434. ;    FADDR =    ADDRESS IN MEMORY TO WRITE/READ (LONG WORD)
  435. ;    NBLKS =    NUMBER OF BLOCKS TO READ/WRITE
  436. ;    OFFTBL = PHYSICAL BASE BLOCK ADDED TO GET TO SUB-DIRECTORY
  437. ;    MAXTBL = LAST PHYSICAL BLOCK + 1 OF SUB-DIRECTORY
  438. ;    UNTTBL = ENTRY POINTS TO UNIT HANDLERS
  439. ;
  440. ;    OUTPUTS:
  441. ;    BLKNOX = SUB-DIRECTORY OFFSET IS ADDED
  442. ;    D0 = OUTPUT DATA (IF ANY)
  443. ;
  444. UNTHAN    MOVE.W    A6,-(SP)    ;SAVE A6, THE FUNCTION CODE
  445.  
  446.     MOVEA.W    UNIT-1,A6    ;GET THE UNIT NUMBER (NO MOVEA.B)
  447.     CMPA.W    #8,A6        ;CHECK FOR LEGAL UNIT NO.
  448.     BLO.S    UHAN10        ;BRANCH IF IT'S OK
  449.     BSR    ERROR
  450.     ASCII    '6 - ILLEGAL UNIT NUMBER'
  451.     DC.B    0
  452.     BRA    UHAN90        ;EXIT
  453.  
  454. UHAN10    ADDA.W    A6,A6        ;BLKNOX := BLKNO + OFFTBL(UNIT)
  455.     ADDA.W    A6,A6        ;TIMES 4 FOR LONG ENTRIES
  456.     MOVE.L    OFFTBL(A6),D0
  457.     ADD.L    BLKNO,D0
  458.  
  459.     CMP.L    MAXTBL(A6),D0    ;IF BLKNO >= MAXTBL(UNIT) THEN
  460.     BLO.S    UHAN20        ;IF WE'RE DOING A READ (8) OR WRITE (12)
  461.     CMPI.W    #8,(SP)        ; THEN FLAG ERROR
  462.     BEQ.S    UHAN17
  463.     CMPI.W    #12,(SP)
  464.     BNE.S    UHAN20
  465. UHAN17    BSR    ERROR
  466.     ASCII    '5 - ACCESS BEYOND END OF UNIT'
  467.     DC.B    0
  468.     BRA.S    UHAN90        ;EXIT
  469.  
  470. UHAN20    MOVE.L    D0,BLKNOX
  471.     MOVEA.L    UNTTBL(A6),A6    ;GET THE ADDRESS OF THE UNIT HANDLER
  472.  
  473.     ADDA.W    (SP),A6        ;ADD THE FUNCTION CODE OFFSET
  474.     MOVEA.L    (A6),A6        ;GET THE ENTRY ADDRESS FROM THE TABLE
  475.     JSR    (A6)        ;CALL THIS HANDLER
  476.  
  477. UHAN90    MOVEA.W    (SP)+,A6    ;RESTORE A6
  478.     RTS
  479.  
  480. ;-----------------------------------------------------------------------
  481. ;MAIN DEVICE HANDLER
  482. ; DISPATCH TO A ROUTINE TO HANDLE THE FUNCTION CODE FOR AN I/O DEVICE.
  483. ;    INPUTS:    DEVICE = THE CURRENT DEVICE NUMBER (0-7)
  484. ;        D0 = INPUT DATA (IF ANY)
  485. ;        A6 = FUNCTION CODE:
  486. ;            0 = OPENI
  487. ;            4 = OPENO
  488. ;            8 = CHIN
  489. ;            12 = CHOUT
  490. ;            16 = CLOSE
  491. ;            20 = GET INFO
  492. ;            24... OTHER SPECIAL CODES ARE ALLOWED (BEWARE OF
  493. ;               SUBSTITUTING DEVICES WITHOUT THESE FUNCTIONS)
  494. ;
  495. DEVHAN    MOVE.W    A6,-(SP)    ;SAVE A6, THE FUNCTION CODE
  496.  
  497.     MOVEA.W    DEVICE-1,A6    ;GET THE DEVICE NUMBER (NO MOVEA.B)
  498.     CMPA.W    #8,A6        ;CHECK FOR LEGAL DEVICE NO.
  499.     BLO.S    DHAN10        ;BRANCH IF IT'S OK
  500.     BSR    ERROR
  501.     ASCII    '1 - ILLEGAL DEVICE NUMBER'
  502.     DC.B    0
  503.     BRA    DHAN90        ;EXIT
  504.  
  505. DHAN10    ADDA.W    A6,A6        ;GET ADDRESS OF HANDLER FROM "DEVTBL"
  506.     ADDA.W    A6,A6        ; (TIMES 4 FOR LONG ENTRIES)
  507.     MOVEA.L    DEVTBL(A6),A6
  508.  
  509.     ADDA.W    (SP),A6        ;ADD THE FUNCTION CODE OFFSET
  510.     MOVEA.L    (A6),A6        ;GET THE ENTRY ADDRESS FROM THE TABLE
  511.     JSR    (A6)        ;CALL THIS HANDLER
  512.  
  513. DHAN90    MOVEA.W    (SP)+,A6    ;RESTORE A6
  514.     RTS
  515.  
  516. ;-----------------------------------------------------------------------
  517. ;NULL DEVICE HANDLER
  518. ;
  519. NULLHAN    DC.L    NULL90        ;0 = OPENI
  520.     DC.L    NULL90        ;1 = OPENO
  521.     DC.L    NULL10        ;2 = CHIN
  522.     DC.L    NULL90        ;3 = CHOUT
  523.     DC.L    NULL90        ;4 = CLOSE
  524.     DC.L    GETINFO        ;5 = GET INFO
  525.     DC.L    NULL90        ;6 = SPARE
  526.     DC.L    NULL90        ;7 = SPARE
  527.  
  528. NULL10    MOVEQ    #EOF,D0        ;RETURN "EOF"
  529. NULL90    RTS
  530.  
  531. GETINFO    MOVE.L    #INFO,D0
  532.     RTS
  533.  
  534. INFO    DC.L    START        ;STARTING ADDRESS OF RESCOD
  535.     DC.L    END        ;ENDING ADDRESS OF RESCOD
  536.     DC.L    NULLSTR        ;DESCRIPTION
  537. NULLSTR    ASCII    'RESCOD    FEB-25-89  Null device handler'
  538.     DC.B    0
  539. NULLEND    EQU    @
  540.  
  541. ;-----------------------------------------------------------------------
  542. ;"HANDLER" FOR AN UNINSTALLED HANDLER (EITHER A DEVICE OR A UNIT)
  543. ;
  544. BADHAN    DC.L    BADHAN1        ;0 = OPENI
  545.     DC.L    BADHAN1        ;1 = OPENO
  546.     DC.L    BADHAN1        ;2 = CHIN
  547.     DC.L    BADHAN1        ;3 = CHOUT
  548.     DC.L    BADHAN1        ;4 = CLOSE
  549.     DC.L    BADHAN2        ;5 = GET INFO
  550.     DC.L    BADHAN1        ;6 = SPARE
  551.     DC.L    BADHAN1        ;7 = SPARE
  552.  
  553. BADHAN1    BSR.S    ERROR
  554.     ASCII    '2 - UNINSTALLED HANDLER'
  555.     DC.B    0
  556.     RTS
  557.  
  558. BADHAN2    MOVE.L    #BADINFO,D0    ;RETURN ADDRESS OF INFO ARRAY
  559.     RTS
  560.  
  561. BADINFO    DC.L    0        ;STARTING ADDRESS
  562.     DC.L    0        ;ENDING ADDRESS
  563.     DC.L    BADSTR        ;DESCRIPTION
  564. BADSTR    ASCII    '(Uninstalled)'
  565.     DC.B    0
  566.  
  567. ;=======================================================================
  568. ;ERROR HANDLER
  569. ; RECORD THE ADDRESS OF THE ERROR MESSAGE UNLESS AN ERROR IS ALREADY
  570. ; RECORDED.
  571. ;
  572. ERROR    MOVEM.L    D0/A0,-(SP)    ;SAVE REGISTERS
  573.  
  574.     MOVEA.L    8(SP),A0    ;GET THE "RETURN ADDRESS" WHICH POINTS
  575.     MOVE.L    A0,D0        ; TO ERROR MESSAGE STRING, & SAVE A COPY
  576. ERR10    TST.B    (A0)+        ;SCAN FOR THE END OF THE STRING
  577.     BNE.S    ERR10        ;LOOP UNITL THE TERMINATOR IS FOUND
  578.  
  579.     ADDQ.L    #1,A0        ;SET THE REAL RETURN ADDRESS
  580.     MOVE.L    A0,8(SP)    ;MAKE SURE IT IS ON THE WORD BOUNDARY
  581.     ANDI.B    #$FE,11(SP)    ; FOLLOWING THE STRING
  582.  
  583.     TST.L    ERRLOC        ;DO WE ALREADY HAVE AN ERROR RECORDED?
  584.     BNE.S    ERR80        ;BRANCH IF WE DO
  585.     MOVE.L    D0,ERRLOC    ;RECORD THE ADDRESS OF THE ERROR MESSAGE
  586.     MOVE.B    UNIT,ERRUNT    ;RECORD THE CURRENT UNIT NUMBER
  587.     MOVE.B    DEVICE,ERRDEV    ;RECORD THE CURRENT DEVICE NUMBER
  588.  
  589. ERR80    TST.B    ERRTRAP        ;ARE WE TRAPPING ERRORS?
  590.     BEQ.S    ERR90        ;BRANCH IF NOT
  591.     BSR.S    SHOWERR        ;DISPLAY ERROR MESSAGE
  592.     BRA    RELOAD        ;RESTART APEX
  593.  
  594. ERR90    MOVEM.L    (SP)+,D0/A0    ;RESTORE REGISTERS
  595.     RTS
  596.  
  597. ;-----------------------------------------------------------------------
  598. ;SHOW ERROR MESSAGE (IF ANY) ON THE CONSOLE.
  599. ; E.G:    ERROR 10 - OUTPUT FILE NOT OPEN
  600. ;    UNIT: 2   DEVICE: 3   ADDRESS: $0456
  601. ;    FIX IT, THEN PRESS "RETURN"
  602. ; INPUTS: ERRLOC, ERRUNT, ERRDEV
  603. ; OUTPUTS:
  604. ;    ERRLOC IS RESET TO ZERO
  605. ;
  606. ;ALSO HANDLE ERRORS ON SYSTEM UNIT (MUST WAIT FOR RETURN KEY)
  607. ;
  608. SHOWERR    TST.L    ERRLOC        ;DO WE HAVE AN ERROR RECORDED?
  609.     BEQ    SER99        ;EXIT IF NOT
  610.     MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  611.  
  612.     CLR.B    DEVICE        ;INITIALIZE THE CONSOLE OUTPUT
  613.     MOVEA.W    #4,A6        ;OPENO(0)
  614.     BSR    DEVHAN        ;(WE MIGHT HAVE HAD A GRAPHIC SCREEN)
  615.  
  616.     LEA    SERM10-@-2(PC),A6 ;"ERROR "
  617.     BSR    TEXT
  618.     MOVEA.L    ERRLOC,A6    ;DISPLAY ERROR STRING
  619.     BSR    TEXT
  620.     MOVEQ    #CR,D0
  621.     MOVEA.W    #12,A6        ;SET "OUTPUT" FUNCTION CODE
  622.     BSR    DEVHAN
  623.  
  624.     LEA    SERM30-@-2(PC),A6 ;UNIT:
  625.     BSR    TEXT
  626.     MOVE.B    ERRUNT,D0
  627.     BSR    NYBOUT
  628.     LEA    SERM40-@-2(PC),A6 ;DEVICE:
  629.     BSR    TEXT
  630.     MOVE.B    ERRDEV,D0
  631.     BSR    NYBOUT
  632.     LEA    SERM50-@-2(PC),A6 ;ADDRESS:
  633.     BSR    TEXT
  634.     MOVE.L    ERRLOC,D0
  635.     BSR    HEXOUT
  636.     MOVEQ    #CR,D0
  637.     MOVEA.W    #12,A6        ;SET "OUTPUT" FUNCTION CODE
  638.     BSR    DEVHAN
  639.  
  640.     MOVE.B    ERRUNT,D0    ;IS THE ERROR ON THE SYSTEM UNIT?
  641.     CMP.B    SYSUNT,D0
  642.     BNE.S    SER80        ;BRANCH IF NOT
  643. ;*** This should also check to see if the error was actually caused by
  644. ; a disk drive ***
  645.     LEA    SERM60-@-2(PC),A6 ;FIX IT, THEN PRESS "RETURN"
  646.     BSR    TEXT
  647.     MOVEA.W    #0,A6        ;OPENI(0)
  648.     BSR    DEVHAN
  649.     MOVEA.W    #8,A6        ;CHIN(0), I.E. WAIT FOR RETURN KEY
  650.     BSR    DEVHAN
  651.     BRA    RELOAD        ;RELOAD APEX & START FROM THE BEGINNING
  652.  
  653. SER80    CLR.L    ERRLOC        ;CLEAR REPORTED ERROR
  654.  
  655.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  656. SER99    RTS
  657.  
  658. SERM10    DC.B    CR
  659.     DC.B    BEL
  660.     ASCII    'ERROR '
  661.     DC.B    0
  662. SERM30    ASCII    'UNIT: '
  663.     DC.B    0
  664. SERM40    ASCII    '   DEVICE: '
  665.     DC.B    0
  666. SERM50    ASCII    '   ADDRESS: $'
  667.     DC.B    0
  668. SERM60    ASCII    'FIX IT, THEN PRESS "RETURN"'
  669.     DC.B    0
  670.  
  671. ;======================================================================
  672. ;SUBROUTINES
  673. ; ALTHOUGH THESE SUBROUTINES ARE IN INT32.68K, THEY ARE REPRODUCED HERE
  674. ; TO MAKE RESCOD.68K INDEPENDENT.
  675. ;
  676. ;-----------------------------------------------------------------------
  677. ;OUTPUT THE TEXT STRING POINTED TO BY A6 TO "DEVICE"
  678. ;
  679. TEXT    MOVEM.L    D0/A0/A6,-(SP)    ;SAVE REGISTERS
  680.  
  681.     MOVEA.L    A6,A0        ;GET SET UP STRING POINTER IN A0
  682.     MOVEA.W    #12,A6        ;SET FUNCTION CODE FOR "CHOUT"
  683.     BRA.S    TXT20        ;ENTER THE LOOP
  684.  
  685. TXT10    BSR    DEVHAN        ;OUTPUT CHARACTER TO "DEVICE"
  686. TXT20    MOVE.B    (A0)+,D0    ;GET CHARACTER AT POINTER
  687.     BNE.S    TXT10        ;LOOP UNTIL TERMINATOR (0)
  688.  
  689.     MOVEM.L    (SP)+,D0/A0/A6    ;RESTORE REGISTERS
  690.     RTS
  691.  
  692. ;-----------------------------------------------------------------------
  693. ;OUTPUT D0 IN ASCII HEX (8 DIGITS) TO "DEVICE"
  694. ;
  695. HEXOUT    SWAP    D0        ;GET HIGH WORD
  696.     BSR.S    WRDOUT        ;OUTPUT IT
  697.     SWAP    D0        ;(PFALL) RESTORE D0 & OUTPUT LOW WORD
  698.  
  699. ;-----------------------------------------------------------------------
  700. ;OUTPUT D0 IN ASCII HEX (4 DIGITS) TO "DEVICE"
  701. ;
  702. WRDOUT    MOVE.W    D0,-(SP)    ;SAVE LOW BYTE
  703.     ASR.W    #8,D0        ;MOVE HIGH BYTE DOWN
  704.     BSR.S    BYTOUT        ;OUTPUT IT
  705.     MOVE.W    (SP)+,D0    ;(PFALL) GET LOW BYTE AND OUTPUT IT
  706.  
  707. ;-----------------------------------------------------------------------
  708. ;OUTPUT D0 IN ASCII HEX (2 DIGITS) TO "DEVICE"
  709. ;
  710. BYTOUT    MOVE.W    D0,-(SP)    ;SAVE LOW NYBBLE
  711.     ASR.W    #4,D0        ;MOVE HIGH NYBBLE DOWN
  712.     BSR.S    NYBOUT        ;OUTPUT IT
  713.     MOVE.W    (SP)+,D0    ;(PFALL) GET LOW NYBBLE AND OUTPUT IT
  714.  
  715. ;-----------------------------------------------------------------------
  716. ;OUTPUT D0 IN ASCII HEX (1 DIGIT) TO "DEVICE"
  717. ;
  718. NYBOUT    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  719.     ANDI.W    #$F,D0        ;WORK WITH LOW NYBBLE ONLY
  720.     CMPI.W    #10,D0
  721.     BLO.S    NO10
  722.     ADDQ.W    #7,D0
  723. NO10    ADDI.W    #'0',D0        ;CONVERT TO ASCII
  724.     MOVEA.W    #12,A6        ;SET THE FUNCTION CODE TO "CHOUT"
  725.     BSR    DEVHAN        ;OUTPUT D0
  726.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  727.     RTS
  728.  
  729. END    EQU    @-1        ;MARK END OF MODULE
  730.  
  731.     IF    @ > MEMTOP-$2900
  732.     ERROR -- FILE IS TOO LONG
  733.     ENDIF
  734.  
  735. ;-----------------------------------------------------------------------
  736. ;
  737. ;HOOK HANDLERS INTO UNIT AND DEVICE HANDLER TABLES
  738.     ORG    UNTTBL
  739.     DC.L    BADHAN        ;0
  740.     DC.L    BADHAN        ;1
  741.     DC.L    BADHAN        ;2
  742.     DC.L    BADHAN        ;3
  743.     DC.L    BADHAN        ;4
  744.     DC.L    BADHAN        ;5
  745.     DC.L    BADHAN        ;6
  746.     DC.L    BADHAN        ;7
  747.  
  748.     ORG    DEVTBL
  749.     DC.L    BADHAN        ;0
  750.     DC.L    BADHAN        ;1
  751.     DC.L    BADHAN        ;2
  752.     DC.L    BADHAN        ;3
  753.     DC.L    BADHAN        ;4
  754.     DC.L    BADHAN        ;5
  755.     DC.L    BADHAN        ;6
  756.     DC.L    NULLHAN        ;7
  757.  
  758. ;-----------------------------------------------------------------------
  759. ;INITIALIZE SYSTEM PAGE PARAMETERS
  760.  
  761.     ORG    VSTART
  762.     JMP    OPENUNT2.L    ;APEX START ENTRY POINT
  763.     JMP    RELOAD.L    ;APEX RESTART ENTRY POINT
  764.     JMP    VRENTR.L    ;PROGRAM NORMAL EXIT ADDRESS (CTRL-C)
  765.     JMP    VRENTR.L    ;PROGRAM ERROR EXIT ADDRESS
  766.     JMP    VSAVER.L    ;PROGRAM ABORT EXIT ADDRESS (CTRL-P)
  767.  
  768.     ORG    SYSUNT
  769.     DC.B    0
  770.  
  771.     ORG    VALUNT
  772.     DC.B    0
  773.  
  774.     ORG    LOKMSK
  775.     DC.B    0
  776.  
  777.     ORG    DEVICE-1
  778.     DC.W    0
  779.  
  780.     ORG    UNIT-1
  781.     DC.W    0
  782.  
  783. ;SET UP LINK VECTORS
  784.     ORG    VBUG
  785.     JMP    BADHAN1.L    ;(Must install Debugger to set this)
  786.     JMP    RELOAD.L
  787.     JMP    RENTER.L
  788.     JMP    SAVER.L
  789.     JMP    FRUN.L
  790.     JMP    FGET.L
  791.     JMP    FSAVE.L
  792.     JMP    BADHAN1.L    ;FASAVE.L (OBSOLETE)
  793.     JMP    FSCAN.L
  794.     JMP    UNTHAN.L
  795.     JMP    DEVHAN.L
  796.     JMP    SHOWERR.L
  797.     JMP    ERROR.L
  798.  
  799.     END
  800. SAVE.L
  801.     JMP    B